export const formatTime = (date: Date) => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return (
    [year, month, day].map(formatNumber).join('/') +
    ' ' +
    [hour, minute, second].map(formatNumber).join(':')
  )
}

const formatNumber = (n: number) => {
  const s = n.toString()
  return s[1] ? s : '0' + s
}


export function formatDate(date: Date): string {
  const y = date.getFullYear();
  const m = String(date.getMonth() + 1).padStart(2, '0');
  const d = String(date.getDate()).padStart(2, '0');
  return `${y}-${m}-${d}`;
}


/**
 * 计算累计存活天数
 * @param prevDaysAlive - 之前累计存活天数（整数）
 * @param lastCheckinTime - 上次打卡时间（Date 类型）
 * @param now - 当前时间，默认 new Date()
 * @returns 累计存活天数（整数）
 */
export function calcTotalDaysAlive(
  prevDaysAlive: number,
  lastCheckinTime: Date,
  now: Date = new Date()
): number {
  // 计算当前时间与最后打卡时间的时间差，单位毫秒
  const diffMs = now.getTime() - lastCheckinTime.getTime();

  if (diffMs < 0) {
    // 如果当前时间比最后打卡时间还早，返回已有天数，不变
    return prevDaysAlive;
  }

  // 计算相差的天数，向下取整
  const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));

  return prevDaysAlive + diffDays;
}


/**
 * 计算最近打卡距离当前时间多少天前，单位：天
 * @param lastCheckinTime - 最后打卡时间（Date 类型）
 * @param now - 当前时间，默认 new Date()
 * @returns 返回字符串，比如："2 天前"、"今天"、"刚刚"
 */
export function getLastCheckinDaysAgo(
  lastCheckinTime: Date,
  now: Date = new Date()
): string {
  const diffMs = now.getTime() - lastCheckinTime.getTime();

  if (diffMs < 0) {
    return '未来';
  }

  const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));

  if (diffDays === 0) {
    // 判断是“刚刚”还是“今天”
    const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
    if (diffHours === 0) {
      return '刚刚';
    }
    return '今天';
  }

  return `${diffDays} 天前`;
}

export function getAchievementByDays(daysAlive: number): string {
  if (daysAlive >= 1000) return '🧬 永生者';
  if (daysAlive >= 500) return '🗿 传说级钉子户';
  if (daysAlive >= 200) return '🐲 仙风道骨';
  if (daysAlive >= 100) return '👑 不死传说';
  if (daysAlive >= 60) return '🪴 活久见';
  if (daysAlive >= 30) return '🌳 稳如老狗';
  if (daysAlive >= 14) return '🌿 挺住了一阵子';
  if (daysAlive >= 7) return '🌱 活着真不错';
  if (daysAlive >= 1) return '🐣 刚活过来';
  return '🍼 新生报到';
}



